/**
 *	@file	pmtel_datman.c
 *	@brief	電話データマネージャー
 *	@author	Miyuki Iwasawa
 *	@date	08.02.19
 */

#include "common.h"
#include "tel/pmtel_book.h"
#include "tel/pmtel_datman.h"

#define TELBOOK_DAT_FILE	"tel/pmtel_book.dat"
extern const u16 DATA_PMTelPersonMsgArcIndexTable[];

/*
 *	@brief	電話帳データの全配列をアロケートしたメモリに読み込む
 *
 *	@param	heapID	アロケートに使用するヒープID
 *
 *	＊内部で2段階にメモリを確保しているので、かならずFree関数を使って解放してください
 */
PMTEL_BOOK_MAN* PMTelBookData_AllocAll(int heapID)
{
	FSFile	fp;
	PMTEL_BOOK_MAN* man;
	int size;

	FS_InitFile(&fp);
	if(!FS_OpenFile(&fp,TELBOOK_DAT_FILE)){
		OS_Printf("FS_OpenFile(\"%s\")...Failed\n",TELBOOK_DAT_FILE);
		GF_ASSERT(0);
		return NULL;
	}
	//ファイル長取得
	size = FS_GetLength(&fp);

	//アロケーションメモリ確保
	man = sys_AllocMemory(heapID,size);
	MI_CpuClear8(man,size);

	//データ配列数取得
	FS_ReadFile(&fp,&man->num,4);

	man->data = sys_AllocMemory(heapID,sizeof(PMTEL_BOOK)*man->num);
	FS_ReadFile(&fp,man->data,sizeof(PMTEL_BOOK)*man->num);

	(void)FS_CloseFile(&fp);
	return man;
}

/**
 *	@brief	電話帳データの解放
 */
void PMTelBookData_Free(PMTEL_BOOK_MAN* man)
{
	MI_CpuClear8(man->data,sizeof(PMTEL_BOOK)*man->num);
	sys_FreeMemoryEz(man->data);

	MI_CpuClear8(man,sizeof(PMTEL_BOOK_MAN));
	sys_FreeMemoryEz(man);
}

/**
 *	@brief	指定のトレーナーIDを持つ電話帳データを取得する
 *
 *	@param	tr_id	トレーナーID
 *	@param	data	電話帳データを取得する構造体型メモリへのポインタ
 *	@parm	heapID	一時メモリ確保に使用するheapID
 */
u8 PMTelBookData_GetDataFromTrID(u16 tr_id,PMTEL_BOOK* data,int heapID)
{
	PMTEL_BOOK_MAN* man;
	int i;

	man = PMTelBookData_AllocAll(heapID);

	for(i = 0;i < man->num;i++){
		if(man->data[i].tr_id == tr_id){
			MI_CpuCopy8(&man->data[i],data,sizeof(PMTEL_BOOK));
			PMTelBookData_Free(man);
			return data->id;
		}
	}
	PMTelBookData_Free(man);
	MI_CpuClear8(data,sizeof(PMTEL_BOOK));
	data->id = PMTEL_NUMBER_NULL;

	return PMTEL_NUMBER_NULL;
}

/**
 *	@brief	電話番号から、個人用gmmのアーカイブIDを返す
 */
u16 PMTelData_GetPersonalMsgArcID(u8 no)
{
	return DATA_PMTelPersonMsgArcIndexTable[no];
}

/**
 *	@brief	アオイが仕事時間かどうかチェック
 *
 *	フィールドとポケギア内両方で使いたいので常駐させます
 *	関数をおくソースに迷ったので、ここにおきます
 *
 *	ラジオのバラエティチャンネルの番組抽選と同じにしておく必要があります
 *	application\radio\pm_radio.c -> pmradio_GetProgramFromChIDの RADIO_CH_MULTIのチェック
 */
BOOL PMTelData_IsAoiWorking(u8 hour)
{
	if((hour % 3) == 2){
		return TRUE;
	}
	return FALSE;
}

